package com.fs.redis.service;

import com.fs.redis.cache.RedisKeys;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.security.SecurityProperties.User;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class RedisCacheService {
	
	private static final Logger logger = LoggerFactory.getLogger(RedisCacheService.class);
	
    /**
     * '@Cacheable在每次执行前都会检查Cache中是否存在相同key的缓存元素，
     * 如果存在就不再执行该方法，而是直接从缓存中获取结果进行返回，
     * 否则才会执行并将返回结果存入指定的缓存中。
     * 固定key
     * redis缓存
     * @return
     * @author pangps
     * @create  2017年7月28日
     */
    @Cacheable(value = RedisKeys._CACHE_MPC, key = "'" + RedisKeys._CACHE_MPC + "'")
    public String testCache() {
    	logger.info("从Redis缓存中读取数据：");
    	return "";
    }

    /**
     * 存储在Redis中的key自动生成，生成规则详见CachingConfig.keyGenerator()方法
     * @param str1
     * @param str2
     * @return
     * @author pangps
     * @create  2017年7月28日
     */
    @Cacheable(value = RedisKeys._CACHE_MPC)
    public String testCache2(String str1, String str2) {
        return RandomStringUtils.randomNumeric(4);
    }
    
    /**
     * @CachePut在执行前不会去检查缓存中是否存在之前执行过的结果，
     * 而是每次都会执行该方法，并将执行结果以键值对的形式存入指定的缓存中
     * @param user
     */
    @CachePut(value="common",key="#user.getUserName()")  
    public void insertSelective(User user) {  
        //update();
    }  
  
    /**
     * '@CacheEvict是用来标注在需要清除缓存元素的方法或类上的,
     * 当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作
     * @param id
     */
    @CacheEvict(value="common",key="'id_'+#id")  
    public void deleteByPrimaryKey(Integer id) {  
       //Delete();
    }
}